package config

import (
	"fmt"
	"log"
	"time"

	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/logger"
)

var GormDB *gorm.DB

// DatabaseConfig 数据库配置结构体
type DatabaseConfig struct {
	Host     string `json:"host"`
	Port     int    `json:"port"`
	User     string `json:"user"`
	Password string `json:"password"`
	Database string `json:"database"`
	Charset  string `json:"charset"`
}

// GetDatabaseConfig 获取数据库配置
// 完全依据配置文件获取，不再使用环境变量
// 默认使用dev环境
func GetDatabaseConfig() *DatabaseConfig {
	// 直接从配置文件读取，使用dev环境
	return GetDatabaseConfigFromFile("dev")
}

// GetDatabaseConfigWithEnv 获取指定环境的数据库配置
// dbEnv: 数据库环境 (如: dev, product)
func GetDatabaseConfigWithEnv(dbEnv string) *DatabaseConfig {
	return GetDatabaseConfigFromFile(dbEnv)
}

// GetDatabaseConfigFromFile 从配置文件获取数据库配置
// dbEnv: 数据库环境 (如: dev, product)
func GetDatabaseConfigFromFile(dbEnv string) *DatabaseConfig {
	// 读取配置文件（这里使用默认的cosProfile，因为我们只需要数据库配置）
	cfg, err := NewConfig("zyx", dbEnv) // 使用默认的COS profile
	if err != nil {
		log.Printf("读取配置文件失败，使用默认配置: %v", err)
		// 返回默认配置
		return &DatabaseConfig{
			Host:     "localhost",
			Port:     3306,
			User:     "root",
			Password: "root",
			Database: "ntu_campus_assistant",
			Charset:  "utf8mb4",
		}
	}

	return &DatabaseConfig{
		Host:     cfg.Database.Host,
		Port:     cfg.Database.Port,
		User:     cfg.Database.User,
		Password: cfg.Database.Password,
		Database: cfg.Database.Database,
		Charset:  cfg.Database.Charset,
	}
}



// InitGormDatabase 初始化GORM数据库连接
func InitGormDatabase(config *DatabaseConfig) error {
	dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=%s&parseTime=True&loc=Local&collation=utf8mb4_unicode_ci&sql_mode=TRADITIONAL",
		config.User,
		config.Password,
		config.Host,
		config.Port,
		config.Database,
		config.Charset,
	)

	// 配置GORM日志
	gormConfig := &gorm.Config{
		Logger:                                   logger.Default.LogMode(logger.Info),
		DisableForeignKeyConstraintWhenMigrating: true,
	}

	var err error
	// 添加重试机制，等待数据库启动
	maxRetries := 30
	for i := 0; i < maxRetries; i++ {
		GormDB, err = gorm.Open(mysql.Open(dsn), gormConfig)
		if err == nil {
			break
		}

		log.Printf("数据库连接失败，正在重试 (%d/%d): %v", i+1, maxRetries, err)
		time.Sleep(2 * time.Second)
	}

	if err != nil {
		return fmt.Errorf("GORM数据库连接失败，已重试 %d 次: %v", maxRetries, err)
	}

	// 设置数据库连接字符集
	GormDB.Exec("SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci")
	GormDB.Exec("SET CHARACTER SET utf8mb4")
	GormDB.Exec("SET character_set_connection=utf8mb4")

	// 获取底层的sql.DB对象来设置连接池参数
	sqlDB, err := GormDB.DB()
	if err != nil {
		return fmt.Errorf("获取底层数据库连接失败: %v", err)
	}

	// 设置连接池参数
	sqlDB.SetMaxOpenConns(25)
	sqlDB.SetMaxIdleConns(5)
	sqlDB.SetConnMaxLifetime(5 * time.Minute)

	// 测试连接
	if err := sqlDB.Ping(); err != nil {
		return fmt.Errorf("GORM数据库连接测试失败: %v", err)
	}

	log.Println("GORM数据库连接成功")
	return nil
}

// CloseGormDatabase 关闭GORM数据库连接
func CloseGormDatabase() {
	if GormDB != nil {
		sqlDB, err := GormDB.DB()
		if err == nil {
			sqlDB.Close()
			log.Println("GORM数据库连接已关闭")
		}
	}
}

// GetGormDB 获取GORM数据库实例
func GetGormDB() *gorm.DB {
	return GormDB
}
